package middleware

import (
	"errors"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
	"gligli/model"
	"gligli/serializer"
	"os"
)

// CurrentUser 获取登录用户
func CurrentUser() gin.HandlerFunc {
	return func(c *gin.Context) {
		// uid, _ := c.Cookie("user_id")

		/*
		begin：session用户验证方式
		 */
		//session := sessions.Default(c)
		//uid := session.Get("user_id")
		//if uid != "" {
		//	user, err := model.GetUser(uid)
		//	if err == nil {
		//		c.Set("user", &user)
		//	}
		//}
		/*
		end：session用户验证方式
		 */
		// 改为JWT验证方式
		/*
		begin：JWT验证方式
		 */
		strToken := c.Request.Header.Get("Token")
		//fmt.Println("***************************************")
		//fmt.Println(strToken)
		if strToken != "" {
			claim, err := VerifyAction(strToken)
			if err != nil {
				// TODO: 需要将错误信息打印到日志信息输出，不能加到c.String中
				fmt.Println(err.Error())
				//c.String(200, err.Error())
			} else {
				uid := claim.ID
				user, err := model.GetUser(uid)
				if err == nil {
					c.Set("user", &user)
				}
			}

		}
		/*
		end：JWT验证方式
		 */

		c.Next()
	}
}

//验证jwt token
func VerifyAction(strToken string) (*model.JWTClaims, error) {

	token, err := jwt.ParseWithClaims(strToken, &model.JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(os.Getenv("JWT_Secret")), nil
	})
	if err != nil {
		return nil, err
	}

	claims, ok := token.Claims.(*model.JWTClaims)
	if !ok {
		return nil, errors.New(model.ErrorReLogin)
	}
	if err := token.Claims.Valid(); err != nil {
		return nil, errors.New(model.ErrorReLogin)
	}

	//fmt.Println("verify")
	return claims, nil
}

// AuthRequired 需要登录
func AuthRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		if user, _ := c.Get("user"); user != nil {
			if _, ok := user.(*model.User); ok {
				c.Next()
				return
			}
		}

		c.JSON(200, serializer.Response{
			Status: 401,
			Msg:    "需要登录",
		})
		c.Abort()
	}
}
